package com.bear.maker.meta;

import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.json.JSONUtil;

/**
 * @Author : bear
 * Description :
 * @Create : 2024/11/14 - 20:05
 */
public class MetaManager {
    //要保存的单例对象  volatile保证多线程状态下内存可见性
    private static volatile Meta meta;

    private MetaManager() {
    }

    //这是一个双检锁
    public static Meta getMetaObject() {
        if (meta == null) {
            //在静态方法中使用 synchronized (MetaManager.class) 是基于整个类加锁的，
            //这种加锁方式会锁住 MetaManager 类的 Class 对象，确保只有一个线程能够执行该同步块。
            synchronized (MetaManager.class) {
                if (meta == null) {
                    meta = initMeta();
                }
            }
        }
        return meta;
    }

    private static Meta initMeta() {
        //使用hutool的方法直接读取utf8的字符串
        String metaJson = ResourceUtil.readUtf8Str("meta.json");
        //json字符串转对象，仍然使用hutool工具进行转换,把metaJson字符串转化为Meta类型
        Meta newMeta = JSONUtil.toBean(metaJson, Meta.class);
        //⬆️写到这一步其实就已经把json字符串转化成的对象拿之前用插件生成的对应的json实体类接收好了
        //但存在一个问题，就是每次初始化都要加载读取meta.json文件并转化为bean（如果json文件非常大呢？），
        // 这其实是比较低效率的，我们可以在第一次初始化时就把这个newMeta保存在内存中，以后直接拿来用就可以，这也就是单例模式！！！
        //在项目的运行期间，只存在一个被初始化的对象实例，防止重复初始化，浪费性能，占用内存·
        Meta.FileConfig fileConfig = newMeta.getFileConfig();
        //todo 校验处理默认值
        return newMeta;
    }
}

